package 多线程.CompletableFuture异步编排;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 applyToEither: 两个任务有一个执行完成，获取它的返回值，处理任务并有新的返回值。
 acceptEither: 两个任务有一个执行完成，获取它的返回值，处理任务，没有新的返回值。
 runAfterEither: 两个任务有一个执行完成，不需要获取 future 的结果，处理任务，也没有返回值。
 */
public class ThreadTest09 {
    // 自定义线程池
    public static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务A开始执行...");
            System.out.println("任务A执行完毕...");
            return "A";
        }, executorService);

        CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务B开始执行...");
            System.out.println("任务B执行完毕...");
            return "B";
        }, executorService);

        CompletableFuture<String> futureC = futureA.applyToEither(futureB, (result) -> {
            System.out.println("任务C开始执行...");
            System.out.println("接收到执行完毕的任务的返回值:" + result);
            return "C";
        });

        String i = futureC.get();
        System.out.println("获取到任务C的返回值:" + i);
    }

//    output：
//    任务A开始执行...
//    任务A执行完毕...
//    任务B开始执行...
//    任务B执行完毕...
//    任务C开始执行...
//    接收到执行完毕的任务的返回值:A
//    获取到任务C的返回值:C

}
